
package com.zhike.service.im.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * BBS消息发送者并发实现类.
 * 
 * <p>
 * 因bbs消息是由服务端像所有在线用户转发，因而在用户量较大、并发较多的情况下
 * 很容易出现性能瓶颈，为了解决这个问题因而使用了线程池来提升性能.
 * <p>
 * 关于本类中为什么使用固定数目线程池的原因是：目前BBS消息的发送是跟其它所有消息
 * 转发放在同一台物理机器上，而为了保证其它服务的运行，只能降低BBS消息发送的资源
 * 使用优先级。在大并发BBS消息的情况下，必然会出现队列和等待，但至少不会因此而使
 * 得BBS消息的发送占用大量服务端资源从而影响其它服务。以后为了最大程序提升BBS发送的效率
 * ，可以考虑将BBS的发送独立出去，这样就可以使用newCachedThreadPool线程池策略（无限线
 * 程数）从而以效率优先的模式来处理之.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @since 2.4
 */
public class GroupSenderConcurrentExecutor
{
	private static GroupSenderConcurrentExecutor instance = null;
	
	private ExecutorService pool = null;
	
	public static GroupSenderConcurrentExecutor getInstance()
	{
		if(instance == null)
			instance = new GroupSenderConcurrentExecutor();
		return instance;
	}
	
	private GroupSenderConcurrentExecutor()
	{
		initPool();
	}
	
	private void initPool()
	{
		// 创建一个可重用固定线程数的线程池：
		// 目前给定的最大数目是10线程，可以KChat运维过程中根据综
		// 合性能和压力情况调整此值以便达到最优状态
        pool = Executors.newFixedThreadPool(10);
	}
	
	public void execute(Runnable r)
	{
		pool.execute(r);
	}
	
	public void shutdown()
	{
		pool.shutdown();
	}

}
